﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskQueueDemo
{
    public interface IQueueInfo<T>
    where T : IQueueInfo<T>
    {
        /// <summary>
        /// 剩余作业数量
        /// </summary>
        int JobCount { get; }

        /// <summary>
        /// 当前队列中的作业是否正在处于被消费的状态
        /// </summary>
        bool IsRunning { get; set; }

        /// <summary>
        /// 可有可无
        /// </summary>
        string Name { get; }
    }
    /// <summary>
    /// 任务队列
    /// 包含一组要执行的任务，且包含对下一个队列的引用
    /// 
    /// 所有队列通过引用形成一个环形结构
    /// 
    /// 外面调用静态的 GetCurrent方法，获取下一个消费的队列引用
    /// 
    /// GetCurrent方法需要保证线程安全，不能两个线程 抢到了同一个队列
    /// </summary>
    public class LinkQueue : IQueueInfo<LinkQueue>
    {
        static int num = 1;

        public LinkQueue(ConsoleColor c)
        {
            Jobs = new Queue<int>();
            for (int i = 0; i < 5; i++)
            {
                Jobs.Enqueue(i + 1);
            }

            Name = $"Q-{num}";
            Index = num;
            num++;

            this.Color = c;
        }

        public string Name { get; set; }

        public int Index { get; set; }
        public ConsoleColor Color { get; set; }

        public Queue<int> Jobs { get; set; }

        public int JobCount => Jobs.Count;

        public bool IsRunning { get; set; }
    }
}
